💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    16 피드 템플릿 실습 (Template + Serializers 적용) | ✅ 편저: 코담 운영자

    16강 - 피드 템플릿 실습 (Template + Serializers 적용)

    화면 실습 with Template, Serializers


    ✨ 이번 강의 목표

    • 시리얼라이저로 구성된 피드 데이터를 템플릿에 렌더링
    • 사용자 프로필, 댓글, 좋아요, 삭제 기능 등을 Tailwind 기반으로 구성
    • JavaScript로 Ajax 기반 동적 로딩 처리 (loadMorePosts.js)

    1. 프로젝트 디렉토리 구조 요약

    Django-Instagram/
    ├── django_instagram/
    ├── posts/
    │   ├── api/
    │   ├── templates/posts/index.html
    │   ├── static/js/posts/loadMorePosts.js
    │   ├── views.py
    ├── users/
    ├── db.sqlite3
    

    API + 템플릿 + JS 코드가 유기적으로 결합되어 피드가 동작


    2. URL 설정 (posts/urls.py)

    from django.urls import path
    from . import views
    
    app_name = "posts"
    
    urlpatterns = [
        path('', views.index, name="index"),
        path('create/', views.post_create, name='post_create'),
    ]
    
    • /posts/ → index 뷰에서 사용자 정보 및 템플릿 렌더링
    • /posts/create/ → 글 작성 페이지로 연결

    3. posts/views.py (템플릿용 index 뷰)

    from django.shortcuts import render, get_object_or_404, redirect
    from django_instagram.users.models import User as user_model
    from django.urls import reverse
    
    def index(request):
        if request.method == 'GET': 
            if request.user.is_authenticated:
                user = get_object_or_404(user_model, pk=request.user.id)                        
                return render(request, 'posts/index.html', {"user": user})
        return redirect(reverse('users:main'))
    
    • 로그인한 사용자만 접근 가능
    • 유저 정보와 함께 index.html 템플릿 렌더링

    4. posts/api/views.py - PostListView

    class PostListView(generics.ListAPIView):
        serializer_class = PostSerializer
        permission_classes = [permissions.IsAuthenticated]
    
        def get_queryset(self):
            user = get_object_or_404(user_model, pk=self.request.user.id)
            following = user.following.all()
            return Post.objects.filter(Q(author__in=following) | Q(author=user))
    
        def list(self, request, *args, **kwargs):
            queryset = self.get_queryset()
            serializer = self.get_serializer(queryset, many=True, context={'request': request})
            return Response({"posts": serializer.data}, status=status.HTTP_200_OK)
    

    ✅ 핵심 정리

    • 로그인한 사용자의 글 + 팔로우 유저의 글 조회
    • PostSerializer로 직렬화
    • context로 request를 넘겨 CSRF 토큰 활용

    5. JS 파일 (loadMorePosts.js 요약)

    const response = await fetch(`/api/posts/?format=json`);
    const data = await response.json();
    data.posts.forEach(post => {
      // 프로필, 이미지, 좋아요, 댓글 반복 출력
      // 좋아요 처리: userId 포함 여부 확인
      // 삭제: postDelete / commentDelete 함수 사용
    });
    

    기능 요약

    • fetch()로 API 호출 후 post들을 반복 렌더링
    • 좋아요 하트 클릭 처리
    • 댓글 삭제, 글 삭제 버튼 렌더링 (본인일 때만)
    • 댓글 입력 폼 렌더링 + CSRF 토큰 포함

    6. 템플릿 예시 (index.html 내부)

    {% for post in posts %}
    <div class="rounded-lg shadow bg-white">
      {% if post.author.profile_photo %}
        <img src="{{ post.author.profile_photo }}" class="w-10 h-10 rounded-full">
      {% else %}
        <img src="/static/images/posts/no_avatar.png" class="w-10 h-10">
      {% endif %}
    
      <p>{{ post.author.username }}</p>
      <img src="{{ post.image }}" class="w-full">
      <p>{{ post.caption }}</p>
      <p>좋아요: {{ post.image_likes|length }}</p>
    
      {% for comment in post.comment_post %}
        <p><b>{{ comment.author.username }}</b>: {{ comment.contents }}</p>
      {% endfor %}
    {% endfor %}
    

    7. PostSerializer 설명

    class PostSerializer(serializers.ModelSerializer):
        comment_post = CommentSerializer(many=True)
        author = FeedAuthorSerializer()
        csrf_token = serializers.SerializerMethodField()
    
        def get_csrf_token(self, obj):
            request = self.context.get('request')
            return get_token(request)
    
    • 중첩 구조 직렬화 (Post → Comments → Author)
    • CSRF 토큰을 Serializer에서 함께 전달 → JS 폼에서 사용

    ✅ 정리

    • Django 템플릿 + DRF API + JavaScript를 유기적으로 연결해 피드 구성
    • 시리얼라이저에서 CSRF 토큰을 포함하여 Ajax 기반 작업 가능하게 설계
    • 댓글 삭제/작성/좋아요 클릭 등은 JS와 HTML 구조로 처리

    👉 다음 강의에서는 댓글 등록 기능과 Ajax 기반 인터랙션을 구현합니다.

    TOP
    preload preload